from django.conf import settings
from django.core.files.storage import Storage
from django.utils.deconstruct import deconstructible
from fdfs_client.client import Fdfs_client


@deconstructible
class FasfDFSStorage(Storage):
    """自定义django的存储方法"""

    def __init__(self, base_url=None, client_conf=None):
        """初始化fdfs的配置"""
        self.client_conf = client_conf or settings.FDFS_CLIENT_CONF
        self.base_url = base_url or settings.FDFS_URL

    # 1 重写_open() 此处不需要使用django去打开文件重新加载生成新的名称
    def _open(self, name, mode='rb'):
        """用不到文件打开"""
        pass

    # 2 重写_save() 此处需要将文件保存到fastdfs中，不需要django默认的保存方法
    def _save(self, name, content):
        """将文件保存到fastdfs"""
        # 加载fdfs的配置文件
        client = Fdfs_client(self.client_conf)
        # content是获取的数据，所在这里选择二进制的方式保存
        res = client.upload_by_buffer(content)
        # 判断存储的状态
        if res.get('Status') != 'Upload successed.':
            raise Exception("upload file failed")
        # 获取存储后的文件名
        file_name = res.get('Remote file_id')

        return file_name

    # 3 设置返回文件的完整路由
    def url(self, name):
        """重写返回路由名称"""
        return self.base_url + name

    # 4 判断文件是否存在
    def exists(self, name):
        """
        判断文件是否存在，FastDFS可以自行解决文件的重名问题
        所以此处返回False，告诉Django上传的都是新文件
        """
        return False
